package org.mrlof.navigation;

/**
 * 单元格操作的读写口
 * 
 * @author thiswind (thiswind@gmail.com)
 *
 */
public interface CellReaderAndWriter<T> {
	/**
	 * 定位读写点
	 * @param x 读写点的x
	 * @param y 读写点的y
	 * @return <code>true</code>定位成功。如果此点不可用，则返回<code>false</code>
	 */
	boolean locate(int x, int y);
	/**
	 * 定位读写点
	 * @param p 读写点
	 * @return <code>true</code>定位成功。如果此点不可用，则返回<code>false</code>
	 */
	boolean locate(Point p);
	
	/**
	 * 读取当前基准点
	 * @return 当前基准点的值
	 */
	T readLocale();
	
	/**
	 * 读取相邻点：北边
	 * @return 相邻点的值,如果此点不可用，则返回null
	 */
	T readNorth();
	/**
	 * 读取相邻点：南边
	 * @return 相邻点的值,如果此点不可用，则返回null
	 */
	T readSouth();
	/**
	 * 读取相邻点：东边
	 * @return 相邻点的值,如果此点不可用，则返回null
	 */
	T readEast();
	/**
	 * 读取相邻点：西边
	 * @return 相邻点的值,如果此点不可用，则返回null
	 */
	T readWest();
	
	/**
	 * 读取相邻点：东北
	 * @return 相邻点的值,如果此点不可用，则返回null
	 */
	T readNorthEast();
	/**
	 * 读取相邻点：西北
	 * @return 相邻点的值,如果此点不可用，则返回null
	 */
	T readNorthWest();
	/**
	 * 读取相邻点：东南
	 * @return 相邻点的值,如果此点不可用，则返回null
	 */
	T readSouthEast();
	/**
	 * 读取相邻点：西南
	 * @return 相邻点的值,如果此点不可用，则返回null
	 */
	T readSouthWest();
	
	/**
	 * 移动读写点:北边相邻的点
	 * @return <code>true</code>成功。如果这个点不可用，则返回<code>false</code>
	 */
	boolean moveToNorth();
	/**
	 * 移动读写点：南边相邻的点
	 * @return <code>true</code>成功。如果这个点不可用，则返回<code>false</code>
	 */
	boolean moveToSouth();
	/**
	 * 移动读写点：西边相邻的点
	 * @return <code>true</code>成功。如果这个点不可用，则返回<code>false</code>
	 */
	boolean moveToEast();
	/**
	 * 移动读写点：东边相邻的点
	 * @return <code>true</code>成功。如果这个点不可用，则返回<code>false</code>
	 */
	boolean moveToWest();
	
	/**
	 * 移动读写点：东北边相邻的点
	 * @return <code>true</code>成功。如果这个点不可用，则返回<code>false</code>
	 */
	boolean moveToNorthEast();
	/**
	 * 移动读写点：西北边相邻的点
	 * @return <code>true</code>成功。如果这个点不可用，则返回<code>false</code>
	 */
	boolean moveToNorthWest();
	/**
	 * 移动读写点：东南边相邻的点
	 * @return <code>true</code>成功。如果这个点不可用，则返回<code>false</code>
	 */
	boolean moveToSouthEast();
	/**
	 * 移动读写点：西南边相邻的点
	 * @return <code>true</code>成功。如果这个点不可用，则返回<code>false</code>
	 */
	boolean moveToSouthWest();
	
	/**
	 * 无条件设置当前读写点的值
	 * @param value 要设置的值
	 * @return <code>true</code>设置成功
	 */
	boolean setValue(T value);
	

	/**
	 * 比较并且设置当前读写点的值。
	 * 如果符合比较条件，则设置
	 * @param value 要设置的值
	 * @param mode 设置条件
	 * @return <code>true</code>如果比较条件成立，设置成功
	 */
	boolean compareAndSet(T newValue, CompareCondition<T> condition);
}